package com.manager.user.utils;

public class FileSizeFormatter {

    /**
     * 单位体系枚举：SI (1000进制) 或 IEC (1024进制)
     */
    public enum UnitSystem {
        IEC(1024);

        private final int base;

        UnitSystem(int base) {
            this.base = base;
        }

        public int getBase() {
            return base;
        }
    }

    /**
     * 将文件大小格式化为友好显示的字符串（默认使用 SI 单位，保留两位小数）
     * @param size 文件大小（字节）
     * @return 格式化后的字符串
     */
    public static String format(long size) {
        return format(size, UnitSystem.IEC, 2);
    }

    /**
     * 将文件大小格式化为友好显示的字符串
     * @param size 文件大小（字节）
     * @param system 单位体系（SI 或 IEC）
     * @param decimalPlaces 保留的小数位数
     * @return 格式化后的字符串
     */
    public static String format(long size, UnitSystem system, int decimalPlaces) {
        if (size < 0) {
            throw new IllegalArgumentException("文件大小不能为负数");
        }
        if (size < system.getBase()) {
            return size + "B";
        }
        int base = system.getBase();
        String[] units =  {"B", "KB", "MB", "GB", "TB", "PB", "EB"};
        int exp = (int) (Math.log(size) / Math.log(base));
        if (exp >= units.length) {
            exp = units.length - 1;
        }
        double value = size / Math.pow(base, exp);
        // 格式化数字，根据需要保留小数位数
        String format = decimalPlaces > 0 ?
                String.format("%%.%df%%s", decimalPlaces) : "%d%s";
        return String.format(format, value, units[exp]);
    }

    // 示例用法
    public static void main(String[] args) {
        long size = 1500;

        System.out.println("单位（默认）: " + format(size));

    }
}
